
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // [
            // {
            //     user : 'yy' , 
            //     info : [
            //             {
            //                 type : '牛肉包' ,
            //                 fn
            //             },
            //             {
            //                 type : '粉丝包' ,
            //                 fn
            //             }
            //         ]
            // } 
         
        // ]

        class Observer {
            constructor(name) {
                this.name = name ;
                this.msg = [] ;
            }

            // 添加 --- 订阅
            add(user , type , fn) {
                // 判断yy有没有登记过
                const res = this.msg.filter(item => item.user === user)[0] ;     // 浅复制  res和msg中的对象地址共享
                if(res) {   // 找到了
                    // 判断这个类型是否添加过  -- 不需要再添加
                    // const info = res.info ;
                    const { info } = res ; 
                    const res2 = info.filter(item => item.type === type)[0] ;
                    if(!res2) {   // 如果没有添加过  就再这个用户下面添加数据
                        const obj = {type , fn} ;
                        info.push(obj) ;               // res.info 发生了改变    msg中的对象同样也会发生改变
                        // console.log(this.msg);
                    }


                } else {  // 没有登记过
                    // 创建一条新的记录
                    const obj = {user , info:[{type , fn}]} ;
                    // 
                    this.msg.push(obj) ;
                    // console.log(this.msg);
                }
            }

            // 取消订单   --- 谁取消了哪个订单
            remove(user , type ) {
                // 判断是否有这个用户 ， 
                const res = this.msg.filter(item => item.user === user)[0] ;   // res和msg中的对象是地址共享的
                if(res) {
                    // 是否有这个订单
                    let { info } = res ; 
                    const res2 = info.filter(item => item.type === type)[0] ;    // 浅复制
                    if(res2) {
                        // 取消这个订单

                        // 找到除了这个类型以外的数据
                        res.info = info.filter(item => item.type !== type) ;    //   

                        console.log(this.msg);

                        // 判断这个用户没有任何订单   就把用户直接删掉

                        
                        // // for  forEach
                        // for(let i = 0 ; i < this.msg.length ; i++) {
                        //     if(this.msg[i].user === user) {
                        //         // i 就是要找的下标
                        //         this.msg[i].info = info ;
                        //         console.log(this.msg);

                        //         // for(let j = 0 ; j < this.msg[i].info.length ; j++) {
                        //         //     if(this.msg[i].info[j].type === type) {
                        //         //         this.msg[i].info.splice(j , 1) ;
                        //         //         console.log(this.msg);
                        //         //         break ;
                        //         //     }
                        //         // }
                        //         break ;
                        //     }
                        // }
                    }
                }
                
            }



        }


        const yy = new Observer('yy') ;
        yy.add('zs' , '豆沙包' , function() {
            console.log('zs需要豆沙包');
        })

        yy.add('zs' , '青菜包' , function() {
            console.log('zs需要青菜包');
        })

        yy.remove('zs' , '青菜包' )
        yy.remove('zs' , '豆沙包' )

    </script>
    
</body>
</html>
